/*
 * imagenes.cpp
 *
 *  Created on: 5/9/2014
 *      Author: anonimo
 */

#include "imagenes.h"
#include "SDL2/SDL.h"
#include "SDL2/SDL_image.h"
#include <iostream>

#define PATH_CIRCULO "/home/anonimo/workspace/PruebaSDL/resources/circulo.png"
#define PATH_TRIANGULO "/home/anonimo/workspace/PruebaSDL/resources/triangulo.png"
#define PATH_CUADRADO "/home/anonimo/workspace/PruebaSDL/resources/cuadrado.png"
#define PATH_PENTAGONO "/home/anonimo/workspace/PruebaSDL/resources/pentagono.png"
#define PATH_HEXAGONO "/home/anonimo/workspace/PruebaSDL/resources/hexagono.png"
#define PATH_TRAPECIO "/home/anonimo/workspace/PruebaSDL/resources/trapecio.png"
#define PATH_PARALELOGRAMO "/home/anonimo/workspace/PruebaSDL/resources/paralelogramo.png"
#define PATH_CIRCULO_NEGRO "/home/anonimo/workspace/PruebaSDL/resources/circulo_negro.png"
#define FACTOR_CONVERSION 10
//#define PATH_TRIANGULO_RECTANGULO "/home/anonimo/workspace/PruebaSDL/resources/triangulo_rectangulo.png"


//funciones auxiliares -----------------------------------------------------------------------------------



//Convierte un color representado a partir de una cadena de caracteres a su valor numerico red green blue.
//la cadena debe ser del tipo "#02FF12"
int* convertir_hex_a_rgb (std::string color){

	int* resultado = (int*) malloc(3*(sizeof(int)));
	const char *red = (color.substr(1,2)).c_str();
	resultado[0] = strtol(red,NULL,16);


	const char *green = (color.substr(3,2)).c_str();
	resultado[1] =strtol(green,NULL,16);


	const char *blue = (color.substr(5,2)).c_str();
	resultado[2] =strtol(blue,NULL,16);

	return resultado;
}


void cambiarColorFigura(SDL_Texture* figura,char* color){
	std::string string_color(color);
	int* rgb = convertir_hex_a_rgb(string_color);
	if(!SDL_SetTextureColorMod( figura ,  rgb[0],rgb[1], rgb[2] )){
		//mandarle el error al log.
	}
	free(rgb);
}


int conversion_metro_a_pixel(double entrada,int max_pix, int max_mundo){
	return ( max_pix * ( entrada / max_mundo ) );

}


int transformar_coord_y_a_sdl(double coord,int alto_pantalla, int alto_mundo){
	int coord_sdl = ( alto_pantalla - conversion_metro_a_pixel(coord,alto_pantalla,alto_mundo) );
	return coord_sdl;
}


int transformar_coord_x_a_sdl(double coord,int ancho_pantalla,int ancho_mundo){
	int coord_sdl = conversion_metro_a_pixel(coord,ancho_pantalla,ancho_mundo);
	return coord_sdl;
}


//Creacion de texturas -----------------------------------------------------------------------------

SDL_Texture* crearTriangulo(SDL_Renderer* renderer,char* color){

	SDL_Texture * triangulo = IMG_LoadTexture(renderer, PATH_TRIANGULO);
	if (triangulo == NULL){
	   return NULL;
	}
	cambiarColorFigura(triangulo,color);
	return triangulo;

}




SDL_Texture* crearRectangulo(SDL_Renderer* renderer,char* color){

	SDL_Texture * cuadrado = IMG_LoadTexture(renderer, PATH_CUADRADO);
	if (cuadrado == NULL){
	   return NULL;
	}
	cambiarColorFigura(cuadrado,color);
	return cuadrado;

}




SDL_Texture* crearCirculo(SDL_Renderer* renderer,char* color){
	int* rgb =  convertir_hex_a_rgb(color);
	if ( rgb[0] < 10 && rgb[1] <10 && rgb[2]<10){
		SDL_Texture * circulo = IMG_LoadTexture(renderer, PATH_CIRCULO_NEGRO);
			if (circulo == NULL){
				//copiar error al log
				return NULL;
		}
		free (rgb);
		return circulo;
	}
	free(rgb);
	SDL_Texture * circulo = IMG_LoadTexture(renderer, PATH_CIRCULO);
	if (circulo == NULL){
		//copiar error al log
		return NULL;
	}
	cambiarColorFigura(circulo,color);
	return circulo;
}




SDL_Texture* crearPentagono(SDL_Renderer* renderer,char* color){
	SDL_Texture * pentagono = IMG_LoadTexture(renderer, PATH_PENTAGONO);
	if (pentagono == NULL){
		//copiar error al log
		return NULL;
	}
	cambiarColorFigura(pentagono,color);
	return pentagono;
}




SDL_Texture* crearHexagono(SDL_Renderer* renderer,char* color){
	SDL_Texture * hexagono = IMG_LoadTexture(renderer, PATH_HEXAGONO);
	if (hexagono == NULL){
		//copiar error al log
		return NULL;
	}
	cambiarColorFigura(hexagono,color);
	return hexagono;
}



SDL_Texture* crearTrianguloRectangulo(SDL_Renderer* renderer,char* color){
	SDL_Texture * triangulo_rectangulo = IMG_LoadTexture(renderer, PATH_HEXAGONO);
	if (triangulo_rectangulo == NULL){
		//copiar error al log
		return NULL;
	}
	cambiarColorFigura(triangulo_rectangulo,color);
	return triangulo_rectangulo;
}




SDL_Texture* crearTrapecio(SDL_Renderer* renderer,char* color){
	SDL_Texture * trapecio = IMG_LoadTexture(renderer, PATH_TRAPECIO);
	if (trapecio == NULL){
		//copiar error al log
		return NULL;
	}
	cambiarColorFigura(trapecio,color);
	return trapecio;
}




SDL_Texture* crearParalelogramo(SDL_Renderer* renderer,char* color){
	SDL_Texture * figura = IMG_LoadTexture(renderer, PATH_PARALELOGRAMO);
	if (figura == NULL){
		//copiar error al log
		return NULL;
	}
	cambiarColorFigura(figura,color);
	return figura;
}





void dibujarFigura(SDL_Renderer* renderer,SDL_Texture* cuadrado,double alto,double ancho,double angulo,double centro_x,double centro_y){

	SDL_Rect dstrect = {(int)(centro_x -(ancho / 2)) , (int)(centro_y -(alto/2)) ,(int)ancho ,(int) alto};

	SDL_Point centro = {(int)(ancho/2),(int)(alto/2)};

	SDL_RenderCopyEx(renderer, cuadrado, NULL, &dstrect,angulo, &centro,SDL_FLIP_NONE);
}





